import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Set;

/**
 * La classe ClientAdministration fait parti du mini-projet "reservation".
 * Elle permet, de consulter, d'ajouter, de modifier ou de supprimer des données.
 * 
 * @author Maugard Matthieu & Paeta Suzy
 * @version V 1.0.0
 */

public class ClientAdministration {

	private Serveur serveur;

	/**
	 * Constructeur
	 */
	public ClientAdministration() {
		this.serveur = new Serveur();
	}

	//==========================================================================================================
	//================Méthodes pour les objets==================================================================
	//==========================================================================================================

	/**
	 * @param filename
	 * @param t
	 */
	public void ajouterTransport(String filename, Transport t){

		ArrayList<Transport> transports = new ArrayList<Transport>();

		transports = serveur.deserialiser(filename);

		transports.add(t);
		serveur.serialiser(filename, transports);
	}

	/**
	 * @param filename
	 * @param index
	 * @param T1
	 */
	public void modifierTransport(String filename, int index,Transport T1)
	{
		ArrayList<Transport> trans = serveur.deserialiser(filename);
		trans.get(index).setCapaciteMax(T1.getCapaciteMax());
		trans.get(index).setNom(T1.getNom());
		trans.get(index).setTrajets(T1.getTrajets());
		trans.get(index).setType(T1.getType());
		serveur.serialiser(filename, trans);
	}	

	/**
	 * @param filename
	 * @param nomTransport
	 */
	public void supprimer(String filename, String nomTransport){
		ArrayList<Transport> transports = serveur.deserialiser(filename);
		for(int i=0; i<transports.size(); i++){
			if(transports.get(i).getNom().equals(nomTransport)){
				transports.remove(i);
			}
		}
		serveur.serialiser(filename, transports);
	}

	/**
	 * 
	 * @param filename
	 */
	public void consulter(String filename)
	{
		ArrayList<Transport> trans = serveur.deserialiser(filename);

		for(int i = 0; i < trans.size(); i++)
		{
			System.out.println(trans.get(i).toString());
		}
	}

	/**
	 * 
	 * @param filename
	 * @param type
	 */
	public void rechercheType(String filename, Types type)
	{
		ArrayList<Transport> trans = serveur.getTransportsType(filename,type);

		for(int i = 0; i < trans.size(); i++)
		{
			System.out.println(trans.get(i).toString());
		}
	}

	/**
	 * 
	 * @param filename
	 * @param ville
	 */
	public void rechercheDepart(String filename, Villes ville)
	{
		ArrayList<Trajet> traj = serveur.getTransportsVillesDepart(filename,ville);

		System.out.println(traj.toString());
	}

	/**
	 * 
	 * @param filename
	 * @param ville
	 */
	public void rechercheArrive(String filename,Villes ville)
	{
		ArrayList<Trajet> traj = serveur.getTransportsVillesArrivee(filename,ville);

		System.out.println(traj.toString());
	}

	/**
	 * 
	 * @param filename
	 * @param ville1
	 * @param ville2
	 */
	public void rechercheVilles(String filename, Villes ville1, Villes ville2)
	{
		ArrayList<Trajet> traj = serveur.getTransportsVilles(filename,ville1,ville2);

		System.out.println(traj.toString());
	}

	/**
	 * 
	 * @param filename
	 * @param date
	 * @param ville1
	 * @param ville2
	 */
	public void rechercheDate(String filename, Date date, Villes ville1, Villes ville2)
	{
		ArrayList<Trajet> traj= serveur.getTransportsVillesDateDepart(filename,ville1,ville2,date);

		System.out.println(traj.toString());

	}

	//==========================================================================================================
	//================Méthodes pour le fichier==================================================================
	//==========================================================================================================

	/**
	 * @param t
	 */
	public void ajouterTransportFichier(Transport t){
		serveur.ecrire(t, true);
	}

	/**
	 * @param index
	 * @param T1
	 */
	public void modifierTransportFichier(int index,Transport T1){

		ArrayList<Transport> trans = serveur.reconstruireTransports();

		trans.get(index).setCapaciteMax(T1.getCapaciteMax());
		trans.get(index).setNom(T1.getNom());
		trans.get(index).setTrajets(T1.getTrajets());
		trans.get(index).setType(T1.getType());

		serveur.supprimerTout();
		for(int i=0; i<trans.size(); i++){
			serveur.ecrire(trans.get(i), true);
		}
	}

	/**
	 * @param nomTransport
	 */
	public void supprimerFichier(String nomTransport){
		ArrayList<Transport> transports = serveur.reconstruireTransports();

		for(int i=0; i<transports.size(); i++){
			if(transports.get(i).getNom().equals(nomTransport)){
				transports.remove(i);
			}
		}

		serveur.supprimerTout();

		for(int j=0; j<transports.size(); j++){
			serveur.ecrire(transports.get(j), true);
		}
	}

	/**
	 * 
	 */
	public void consulterFichier()
	{
		ArrayList<Transport> trans = serveur.reconstruireTransports();

		for(int i = 0; i < trans.size(); i++)
		{
			System.out.println(trans.get(i).toString());
		}
	}

	/**
	 * 
	 * @param type
	 */
	public void rechercheTypeFichier(Types type)
	{
		ArrayList<Transport> trans = serveur.getTransportsTypeFichier(type);

		for(int i = 0; i < trans.size(); i++)
		{
			System.out.println(trans.get(i).toString());
		}
	}

	/**
	 * 
	 * @param ville
	 */
	public void rechercheDepartFichier(Villes ville)
	{
		ArrayList<Trajet> traj = serveur.getTransportsVillesDepartFichier(ville);

		for(int i = 0; i < traj.size(); i++)
		{

			System.out.println(traj.get(i).toString());

		}
	}

	/**
	 * 
	 * @param ville
	 */
	public void rechercheArriveFichier(Villes ville)
	{
		ArrayList<Trajet> traj = serveur.getTransportsVillesArriveeFichier(ville);

		for(int i = 0; i < traj.size(); i++)
		{
			System.out.println(traj.get(i).toString());
		}
	}

	/**
	 * 
	 * @param ville1
	 * @param ville2
	 */
	public void rechercheVillesFichier(Villes ville1, Villes ville2)
	{
		ArrayList<Trajet> traj = serveur.getTransportsVillesFichier(ville1,ville2);

		for(int i = 0; i < traj.size(); i++)
		{
			System.out.println(traj.get(i).toString());
		}
	}

	/**
	 * 
	 * @param date
	 * @param ville1
	 * @param ville2
	 */
	public void rechercheDateFichier(Date date, Villes ville1, Villes ville2)
	{
		ArrayList<Trajet> traj = serveur.getTransportsVillesDateDepartFichier(ville1,ville2,date);

		for(int i = 0; i < traj.size(); i++)
		{
			System.out.println(traj.get(i).toString());
		}
	}

	public Serveur getServeur()
	{
		return this.serveur;
	}

}
